package sicnu.cs.aps.rest;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import sicnu.cs.aps.common.ResultInfo;
import sicnu.cs.aps.common.ResultInfoUtil;
import sicnu.cs.aps.common.annotations.OperLog;
import sicnu.cs.aps.common.enums.*;
import sicnu.cs.aps.domain.entity.ActivityAudit;
import sicnu.cs.aps.domain.form.ActivityAuditForm;
import sicnu.cs.aps.domain.vo.TeamInfoVo;
import sicnu.cs.aps.service.*;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import java.util.NoSuchElementException;

import static sicnu.cs.aps.common.enums.ActivitySignEnum.*;
import static sicnu.cs.aps.common.util.RequestUtil.*;

/**
 * @author CaiKe
 * @date 2022/5/27 10:30
 */
@Slf4j
@RestController
@RequestMapping("/activity/audit")
@RequiredArgsConstructor
@Api(tags = {"活动审核模块", "学院/学校角色权限"})
public class ActivityAuditResource {

    private final IUserInfoService userInfoService;
    private final IUserService userService;
    private final IActivityService activityService;
    private final IActivityTeamService teamService;
    private final ITeamMemberService teamMemberService;


//    @GetMapping("/list")
//    @ApiOperation("获取审核列表（1-待审核；2-已审核）")
//    public ResultInfo<PageInfo<ActivityAuditVo>> listActivityAudit(ActivityAuditQueryForm queryForm) {
//        // 判断身份，获取审核记录
//        PageInfo<ActivityAuditVo> resultActivityAuditPage = new PageInfo<>();
//        if (isCurrentUserAUniversity()) {
//            //查询全部
//            resultActivityAuditPage = activityService.listActivityAudit(queryForm, ROLE_UNIVERSITY);
//            return ResultInfoUtil.buildSuccess();
//        } else if (isCurrentUserACollege()) {
//            //查询本学院
//            resultActivityAuditPage = activityService.listActivityAudit(queryForm, ROLE_COLLEGE);
//            return ResultInfoUtil.buildSuccess();
//        } else {
//            //身份权限不足
//            log.warn("身份不合法，不允许操作");
//            return ResultInfoUtil.buildError(ResultEnum.FORBIDDEN, "权限不足");
//        }
//
//    }

    @GetMapping("/{auditId}")
    @ApiOperation("获取审核详情")
    public ResultInfo<ActivityAudit> getActivityAuditById(@Min(0) @PathVariable Long auditId) {

        return ResultInfoUtil.buildSuccess();
    }


    @PostMapping()
    @ApiOperation("审核活动")
    @OperLog(type = OperEnum.UPDATE)
    public ResultInfo<Void> doAudit(@Valid @RequestBody ActivityAuditForm form) {
        var auditInput = ActivityAuditEnum.getEnum(form.getPass());
        if (auditInput == null || auditInput.getIndex() == 0) {
            log.error("没有找到对应的ActivityAuditEnum");
            return ResultInfoUtil.buildError("输入状态码不合法，只能为:1-不做操作，2-通过，3-驳回,4-不通过");
        }
        var auditNow = teamService.getTeamById(form.getTeamId()).getStatus();
        if (isCurrentUserACollege()) {
            // 当前是学院：校验队长是否是这个学院的学生或老师
            var captainId = form.getCaptainId();
            if (!userInfoService.isUserInCollege(captainId, userService.getCollegeIdByUserId())) {
                return ResultInfoUtil.buildError("只能审核本学院的学生！");
            }
            //非法操作处理
            if (auditNow != SIGN_COMPLETE) {
                //返回不同的错误
                switch (auditNow) {
                    case UNKNOWN:
                        return ResultInfoUtil.buildError("状态为未知，请检查前序操作逻辑是否有遗漏");
                    case SIGN_PASS_NO_PLAN:
                        return ResultInfoUtil.buildError("队伍未提交策划");
                    case COLLEGE_AUDIT_FAIL:
                    case COLLEGE_AUDIT_REBUT:
                        return ResultInfoUtil.buildError("请勿重复审核!");
                    case UNIVERSITY_AUDIT_REBUT:
                    case UNIVERSITY_AUDIT_FAIL:
                    case STUDENT_CANCELED:
                        return ResultInfoUtil.buildError("学生已取消报名!");
                    case UNIVERSITY_AUDIT_ON:
                        return ResultInfoUtil.buildError("已通过学院审核!");
                    case APPLY_SUCCESS:
                        return ResultInfoUtil.buildError("队伍已报名成功");
                    case ACTIVITY_COMPLETE:
                        return ResultInfoUtil.buildError("活动已结束");
                    case ACTIVITY_WAIT_FOR_FEEDBACK:
                        return ResultInfoUtil.buildError("活动无需审核");
                    default:
                        log.error("不合法的状态码,请检查数据库activity_team中state的合法性");
                        throw new NoSuchElementException("状态码错误请检查!");
                }
            }

        } else if (isCurrentUserAUniversity()) {
            // 当前是学校：校验活动是否经过了学院审核
            //非法操作处理
            if (auditNow != UNIVERSITY_AUDIT_ON) {
                // 当前状态不是【学院已通过】，则按照不同情况返回错误信息
                switch (auditNow) {
                    case UNKNOWN:
                        return ResultInfoUtil.buildError("状态为未知，请检查前序操作逻辑是否有遗漏");
                    case SIGN_PASS_NO_PLAN:
                        return ResultInfoUtil.buildError("队伍未提交策划");
                    case SIGN_COMPLETE:
                        return ResultInfoUtil.buildError("请先通过学院审核!");
                    case COLLEGE_AUDIT_FAIL:
                    case COLLEGE_AUDIT_REBUT:
                        return ResultInfoUtil.buildError("未通过学院审核!");
                    case UNIVERSITY_AUDIT_REBUT:
                    case UNIVERSITY_AUDIT_FAIL:
                        return ResultInfoUtil.buildError("请勿重复审核!");
                    case APPLY_SUCCESS:
                        return ResultInfoUtil.buildError("队伍已报名成功");
                    case ACTIVITY_COMPLETE:
                        return ResultInfoUtil.buildError("活动已结束");
                    case STUDENT_CANCELED:
                        return ResultInfoUtil.buildError("学生已取消报名!");
                    case ACTIVITY_WAIT_FOR_FEEDBACK:
                        return ResultInfoUtil.buildError("活动无需审核");
                    default:
                        log.error("不合法的状态码,请检查数据库activity_team中state的合法性");
                        throw new NoSuchElementException("状态码错误请检查!");
                }
            }
        } else {
            return ResultInfoUtil.buildError("只有学院或学校账户才能审核活动！");
        }

        activityService.doActivityAudit(form);
        return ResultInfoUtil.buildSuccess();
    }

    @GetMapping("/{teamId}")
    @ApiOperation("获取小组的审核时间线")
    public ResultInfo getTeamAuditTimeLine(@Min(0) @PathVariable Long teamId) {
        //判断当前身份

        //通过teamId查询队长id
        Long captainId = teamService.getTeamById(teamId).getUserId();
        Long currentUserId = getCurrentUserId();


        //学院只能查看本学院的小队
        if (isCurrentUserACollege()) {
            if (!userInfoService.isUserInCollege(captainId, currentUserId)) {
                return ResultInfoUtil.buildError("只能查看本学院的队伍信息！");
            }
        }

        //老师和学生只能查看自己的小队
        if (isCurrentUserTeacherOrStu()) {
            if (!teamMemberService.isMemberInTeam(currentUserId, teamId)) {
                return ResultInfoUtil.buildError("不允许查看其他小队的信息！");
            }
        }

        //学校或者通过验证的用户
        TeamInfoVo teamDetail = teamService.getTeamDetailById(teamId);
        if (teamDetail == null) {
            return ResultInfoUtil.buildError("队伍不存在或查找失败");
        }
        return ResultInfoUtil.buildSuccess(teamDetail);
    }

}